#pragma once
#include <queue>
#include <pthread.h>


using callback = void (*)(void* arg);

template<typename T>
struct Task
{
    Task<T>()
    {
        functiong = nullptr;
        arg = nullptr;
    }
    Task<T>(callback f, void* arg):functiong(f), arg((T*)arg) {}
    //void (*functiong)(void* arg);
    callback functiong;
    T* arg;
};


template<typename T>
class TaskQueue
{
public:
    TaskQueue();
    ~TaskQueue();

    /* 添加任务 */
    void addTask(Task<T> task);
    void addTask(callback f, void* arg);
    /* 取任务 */
    Task<T> takeTask();
    /* 获取当前任务个数 */
    inline size_t taskNumber()
    {
        return m_taskQ.size();
    }

private:
    pthread_mutex_t m_mutex;
    std::queue<Task<T>> m_taskQ;
};

